import datetime
import random
from exception.api_exception import APIException
from celery_tasks.wjx_celery_tasks import send_wjx_result, SendWjxResultView
from utils.common.init_app import app
from utils.time_utils import convert_shanghai_to_utc_time


def start_task_wjx(work_order_id, link, send_count_arr, item_answer_start, item_answer_end, interval_start,
                   interval_end, area_value_weight_dict, is_fast_order, can_answer_start, can_answer_end):
    title_link = link
    if is_fast_order:  # 极速提交不受发送时间的限制
        cur_time = datetime.datetime.now() + datetime.timedelta(seconds=1)  # 1秒后开始执行第一个任务
        for i in range(len(send_count_arr)):
            run_time = cur_time.strftime("%Y-%m-%d %H:%M:%S.%f")  # 生成每组数据的间隔时间(秒)
            task_id = str(work_order_id) + '_' + str(run_time)  # 根据时间戳(ms)作为唯一表示
            app.logger.info('每组任务的运行时间：' + run_time)
            # 添加定时任务，并分组
            # scheduler.add_job(send_results, 'date', run_date=run_time, id=task_id, jobstore='default', args=(
            #     work_order_id, send_count_arr[i], item_answer_start, item_answer_end, title_link,
            #     area_value_weight_dict))
            # 添加定时任务，并分组
            params = SendWjxResultView.init_obj(work_order_id, send_count_arr[i], item_answer_start, item_answer_end,
                                                title_link, area_value_weight_dict)
            utc_deal_time = convert_shanghai_to_utc_time(cur_time)  # 将本地时区转换为celery需要执行的utc时区
            send_wjx_result.apply_async(args=[params.dict()], eta=utc_deal_time, task_id=task_id)
            # 根据 interval_start 和 interval_end生成一个随机时间
            random_int = random.randint(interval_start, interval_end)
            cur_time = cur_time + datetime.timedelta(seconds=random_int)
    else:  # 非急速提交，所有参数均需要处理
        # 1.判断当前时间是否在当天可发送的时间范围内，如果小于可发送时间，则开始时间为当天的发送时间，如果大于可发送时间，则从明天开始发送
        try:
            ymd = datetime.datetime.now().strftime("%Y-%m-%d")  # 当前时间的年月日
            cas_fmt_time = ymd + ' ' + datetime.datetime.fromtimestamp(can_answer_start / 1000).strftime("%H:%M:%S")
            cae_fmt_time = ymd + ' ' + datetime.datetime.fromtimestamp(can_answer_end / 1000).strftime("%H:%M:%S")
            dt_now = datetime.datetime.now()
            dt_cas = datetime.datetime.strptime(cas_fmt_time, '%Y-%m-%d %H:%M:%S')  # 可发送的开始时间
            dt_cae = datetime.datetime.strptime(cae_fmt_time, '%Y-%m-%d %H:%M:%S')  # 可发送的结束时间
            if can_answer_end <= can_answer_start:  # 如果结束时间小于等于开始时间，则结束时间为明天的这个时间
                dt_cae = dt_cae + datetime.timedelta(days=1)
        except Exception as e:
            raise APIException(message="启动发送失败，解析时间错误")
        # 处理开始时间
        start_time = dt_now
        if dt_now < dt_cas:  # 如果小于可发送时间，则开始时间为当天的发送时间
            start_time = dt_cas
            # print('今天预计的时间开发', start_time)
        elif dt_cas < dt_now < dt_cae:
            pass
            # print('此时开始发送', start_time)
        elif dt_now > dt_cae:
            # 如果大于可发送时间，则从明天开始发送
            dt_cas = dt_cas + datetime.timedelta(days=1)
            dt_cae = dt_cae + datetime.timedelta(days=1)
            start_time = dt_cas
            # print('明天开始发送', start_time)
        else:
            # print('其他时间')
            start_time = dt_now
        start_time = start_time + datetime.timedelta(seconds=3) + datetime.timedelta(
            microseconds=random.randint(100000, 999999))  # 3秒后开始执行第一个任务
        for i in range(len(send_count_arr)):
            run_time = start_time.strftime("%Y-%m-%d %H:%M:%S.%f")  # 生成每组数据的间隔时间(秒)
            task_id = str(work_order_id) + '_' + str(run_time)  # 根据时间戳(ms)作为唯一表示
            # print('每组任务的运行时间：', run_time)
            # 添加定时任务，并分组
            app.logger.info('需要发送的数据：')
            app.logger.info(send_count_arr[i])
            # scheduler.add_job(send_results, 'date', run_date=run_time, id=task_id, jobstore='default', args=(
            #     work_order_id, send_count_arr[i], item_answer_start, item_answer_end, title_link,
            #     area_value_weight_dict))
            params = SendWjxResultView.init_obj(work_order_id, send_count_arr[i], item_answer_start, item_answer_end,
                                                title_link, area_value_weight_dict)
            utc_deal_time = convert_shanghai_to_utc_time(start_time)  # 将本地时区转换为celery需要执行的utc时区
            send_wjx_result.apply_async(args=[params], eta=utc_deal_time, task_id=task_id)
            # 根据 interval_start 和 interval_end生成一个随机时间
            random_int = random.randint(interval_start, interval_end)
            start_time = start_time + datetime.timedelta(seconds=random_int)
            if start_time > dt_cae:
                # 可发送时间往后推迟一天，开始日期+1天，结束日期+1天
                dt_cas = dt_cas + datetime.timedelta(days=1) + datetime.timedelta(
                    microseconds=random.randint(100000, 999999))
                dt_cae = dt_cae + datetime.timedelta(days=1)
                start_time = dt_cas  # 下次开始时间设置为明天第一时刻
    return {"title": '定时任务已启动'}
